# -*- coding: utf-8 -*-
"""
检查并导出ABC格式的摄像机文件

该类用于检查当前场景中的摄像机，并将除“persp”摄像机外的第一个摄像机导出为ABC格式的文件。
导出的文件名基于当前场景文件名，并包含摄像机的视图信息（如front、side、top）。

参数:
- Exp_Path: 字符串，指定导出文件的路径。

返回值:
- 返回字符串，表示是否成功导出。成功返回"YES"，失败返回错误信息。
"""
import maya.cmds as cmds
import maya.mel as mel
import sys
import os

class Check_Export_Cam_ABC():
	def Check_Export_Cam_ABC(self, Exp_Path):
		# 获取当前场景文件路径和名称
		file_path = cmds.file(q=True, sceneName=True)
		file_name = file_path.split('/')[-1]
		file_name = file_name.split('.')
		# 定义临时摄像机名称列表
		CamShapeTmps = ['front', 'persp', 'side', 'top']
		# 获取场景中所有摄像机形状
		AllCamShapes = cmds.listCameras()
		# 选择第一个非“persp”摄像机作为导出对象
		ListCam_list = [i for i in cmds.listCameras(p=1) if i != "persp"]
		ListCam = ListCam_list[0]
		old_cam = ''
		# 判断摄像机节点类型，获取父级摄像机节点或自身
		if cmds.nodeType (ListCam) == "camera" :
			old_cam = cmds.listRelatives (ListCam , p = True)[0]
		else :
			old_cam = ListCam
		if len (ListCam_list) == 1 :
			try:
				# 为摄像机创建新名称，并重命名
				new_cam_name = old_cam + "_OUT"
				new_cam = cmds.rename(cmds.camera()[0], new_cam_name)
				# 创建父级约束，将新摄像机与原摄像机关联
				cmds.parentConstraint(old_cam, new_cam, name=new_cam + '_Constraint')
				# 连接摄像机焦距属性
				new_cam_shape = cmds.listRelatives(new_cam, shapes=True, children=True)[0]
				old_cam_shape = cmds.listRelatives(old_cam, shapes=True, children=True)[0]
				cmds.connectAttr(old_cam_shape + ".focalLength", new_cam_shape + ".focalLength")
				
				# 确定并设置播放范围，对新摄像机进行结果烘焙
				st = int(cmds.playbackOptions(min=1, q=1))
				et = int(cmds.playbackOptions(max=1, q=1))
				cmds.bakeResults(new_cam, t=(st, et), sb=1)
				
				# 删除新摄像机上的约束
				constraints = cmds.listRelatives(new_cam, type="constraint")
				if constraints:
					cmds.delete(constraints)
				
				# 构建并导出ABC文件
				Export_Path = os.path.join(Exp_Path, file_name[0] + '_cam.abc').replace('\\', '/')
				mel.eval('AbcExport -j "-frameRange ' + str(st) + ' ' + str(et) + ' -dataFormat ogawa -root |' + new_cam_name + ' -file ' + Export_Path + '";')
				
				# 清理，删除创建的临时摄像机
				cmds.delete(cmds.ls(new_cam))
				return ("YES")

			except :
				return ("NO-未知错误-手动检查文件")
		else :
			return ("NO-存在多余相机导出失败"+str(ListCam_list))